
#ifndef _IO_CONTROLER_H_
#define _IO_CONTROLER_H_




#include "stl_.h"


/// <summary>
/// 调用间隔 T0 单位，微秒。pwm频率，单位Hz。 如果定时器调用是5us,pwm 是10kHz，那么，只有 20的分度。 20*5*10*1000 = 1000,000。      
/// </summary>
typedef struct _soft_pwm__
{
	unt32 Timer_us;   // 定时器调用间隔，微秒。
	unt16 Counter_Period;   // pwm 计数周期。
	unt16 Compare;          // 比较计数
	unt16 Counter;    // 当前的计数。这个计数只会在 0 - (Counter_Period-1)之间
	bool Counter_Mode;      // 计数模式，默认1，向上。如果是0，向下。
	bool Polarity;          // 当前的极性。到达比较计数，会改变极性。
	bool Central_Symmetry;  // 默认false。是否中心对称。pwm的重点是占空比。

	// 如果是中心对称模式，占空比是不会变的，但示波器测量，频率会减半。
	// 原来两个周期是：00111 00111 ，为了中心对称，计数器到达计数周期，会改变计数模式，
	// 第二个周期改为向下计数： 变成 00111 11100，周期初始极性也改变了。
}soft_pwm;
//

// 至于无刷电机驱动的pwm，需要高一些的分度，就2kHz，100分度吧~。或者高频一些的单片机，2us中断，提高分度。
#define Soft_PWM_Timer_us 5     // 定时器5微秒调用一次。

/// <summary>
/// 用计数周期和高电平计数数量来初始化pwm结构体。
/// 初始电平是1，初始计数模式：向上计数。（不可更改）
/// </summary>
/// <param name="sp">pwm 的结构体</param>
/// <param name="count_period"> 设定计数周期，最小是2，对应的pwm频率 = 1000000 / Soft_PWM_Timer_us / count_period </param>
/// <param name="high_level_in_count_period"> 设定高电平中计数周期的数量，必须小于计数周期，占空比=high_level_in_count_period/count_period </param>
/// <param name="is_Centrosymmetric">波形是否中心对称的</param>
void soft_pwm_init(soft_pwm* sp, int count_period, int high_level_in_count_period, bool is_Centrosymmetric);
//

/// <summary>
/// 模拟pwm 的时钟，间隔sp->Timer_us调用一次。
/// sp->Polarity 会表示当前时刻的电平（极性0或1）
/// </summary>
/// <param name="sp">pwm 的结构体</param>
void soft_pwm_clock(soft_pwm* sp);
//

// 下面绘图测试pwm。向上计数的对称，非对称pwm都测了，没问题。
void test_soft_pwm(void);










#endif







